package com.wft.util;

import java.math.BigDecimal;

/**
 * 算术工具类. <br>
 * <p>
 * Copyright: Copyright (c) 2019/7/29 22:03
 * <p>
 * Company: 南京泰立瑞信息科技有限公司
 * <p>
 *
 * @author ftwang@terrydr.com
 * @version 1.0.0
 */
public class Ariths {
    // 默认除法运算精度
    private static final int DEF_DIV_SCALE = 10;

    private Ariths() {
    }

    /**
     * 方法描述：精确的加法运算
     *
     * @param v1 加数1
     * @param v2 加数2
     * @return 加法运算结果
     * date:2019/7/29 22:13
     * add by:ftwang@terrtdr.com
     */
    public static double add(double v1, double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.add(b2).doubleValue();
    }

    /**
     * 方法描述：精确的减法运算
     *
     * @param v1 被减数
     * @param v2 减数
     * @return 减法运算结果
     * date:2019/7/29 22:12
     * add by:ftwang@terrtdr.com
     */
    public static double sub(double v1, double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 方法描述：精确的乘法运算
     *
     * @param v1 乘数1
     * @param v2 乘数2
     * @return 乘法运算结果
     * date:2019/7/29 22:11
     * add by:ftwang@terrtdr.com
     */
    public static double mul(double v1, double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.multiply(b2).doubleValue();
    }

    /**
     * 方法描述：相对精确的除法运算
     * 当发生除不尽的情况时，精确到小数点以后10位数字四舍五入
     *
     * @param v1 分子
     * @param v2 分母
     * @return 相除结果
     * date:2019/7/29 22:09
     * add by:ftwang@terrtdr.com
     */
    public static double div(double v1, double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    public static void main(String[] args) {
        System.out.println(add(0.1, 0));
    }
}
